package com.xiao.utils;
import org.springframework.beans.BeanUtils;
import java.util.List;
import java.util.stream.Collectors;
// 这里涉及到 泛型 和 stream 流 还有函数式接口 需要提高
public class BeanCopyUtils {

    // copy 单个实例  参数: 目标源实例，接收的.class类对象 返回 接收的 class 类实例

    /**
     *
     * @param source 目标源实例
     * @param vClass 接收的.class类对象
     * @return 得到数据 的  类实例
     * @param <V> 泛型 作用于我们也不知道他会服务什么类，因此用泛型表示。用什么字母意义都一样
     */

    // 因为我们不知道 返回类型是什么,因此用泛型，让使用者决定。
    // 前面 定义了 <V> 后面才能使用 Class<V>

    public static <V> V copyBean(Object source,Class<V> vClass){
        /**
         * 这里的泛型 是两个作用:
         *  1. 规范类型
         *  2. 由参数 2 来决定返回类型是什么
          */

        V result=null;
        try {
            result = vClass.newInstance();
            BeanUtils.copyProperties(source,result);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return result;
    }

    /**
     *
     * @param source 数据源
     * @param vClass 返回类型
     * @return  填充后 的返回类型列表
     * @param <X> 定义的 来源泛型 (主要是不能填写 Object ，值传递会有问题)
     * @param <V> 返回类型 的泛型
     */
    public static  <X,V> List<V> copyBeanList(List<X> source,Class<V> vClass){
        /** 定义泛型: <X,V>
         *  返回类型: List<V>
         */
        // 流的形式来传递值
    return source.stream()
            .map(o -> copyBean(o, vClass))
            .collect(Collectors.toList());

    }
    // 以上方法可以用函数式编程再优化

}
